import { getToken, setToken, removeToken } from '@/utils/auth'
import { login, getUser } from '@/api/user'
import { constantRoutes, resetRouter } from '@/router'
const state = {
    // 数据域
    token: getToken(), // 从cookie中得到数据
    userInfo: {},
    routes: constantRoutes // 静态路由的数组
}

const mutations = {
    // 修改数据域对象
    setToken(state, token) {
        state.token = token // 传参转储
        // 再往 cookie 中持久化存储
        setToken(state.token)
    },

    delToken() {
        state.token = null
        removeToken() // 移除token
    },
    getUserInfoMu(state, users) {
        state.userInfo = users // 保存用户信息
    },
    // state本就存在静态路由，此番要对这个路由补全动态
    setRoutes(state, newRoutes) {
        state.routes = [...constantRoutes, ...newRoutes] // 静态路由 + 动态路由
    }
}

const actions = {
    // 异步修改
    // 日后，所有要发送axios的请求都可以交给actions
    async loginGetToken(context, data) {
        let res = await login(data)
        // token 转储cookie
        context.commit('setToken', res)
    },
    async getUserInfo(context) {
        // 发送请求
        let res = await getUser()
        // 调用 mutations
        context.commit('getUserInfoMu', res)
        return res // 返回数据
    },
    async logout(context) {
        // 退出登录
        context.commit('delToken')
        context.commit('getUserInfoMu', {})

        context.commit('removeToken') // 删除token
        context.commit('setUserInfo', {}) // 设置用户信息为空对象
        // 重置路由
        resetRouter()
    }
}

export default {
    namespaced: true, // 开启命名空间
    // 导出此对象用于给 Vuex 的实例进行model挂载
    state,
    mutations,
    actions
}

